home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / ada_a9x / ex3.ada < prev    next >
Text File  |  1996-01-30  |  2KB  |  72 lines

  1. -- Source Ex3.Ada
  2. -- By Arthur V. Lopes, 7/12/94
  3. -- This program implements a solution for the problem exibited
  4. -- by the program Concurrent_Programming_1.
  5.  
  6. -- It shows you how to exploit one of the advantages of a protected unit.
  7. -- Remember that protected units are available only in Ada 9X.
  8.  
  9. -- By definition, a procedured defined within the specification part
  10. -- of a protected unit can be executed by only one task and no other
  11. -- task can make use of any entity visible of this protected unit while
  12. -- this procedure is executing. See ARM 9.4 for more information.
  13. -- Therefore we will encapsulate calls to services provided by package
  14. -- VT100 into a protected unit.
  15. -- But this will not be sufficient. We will also have to place a layer
  16. -- protecton on top of procedure MoveCursor. 
  17. -- We need to move the cursor and display the character as one atomic 
  18. -- instruction. Procedure Display_At will do this.
  19. -- Compile and run this program.
  20. -- It worked but still does not produces the same effect on the screen
  21. -- as the Sequential_Programming (Ex1.Ada) program did. Why?
  22. -- The next program, Concurrent_Programming_3 will solve the remaining
  23. -- problem.
  24.  
  25. WITH Ada.Text_IO, VT100; USE Ada.Text_IO;
  26. PROCEDURE Concurrent_Programming_2 IS
  27.  
  28.     PROTECTED Screen IS
  29.         PROCEDURE ClearScreen;
  30.         PROCEDURE Display_At(Column, Row : Integer; C : Character);
  31.     END Screen;
  32.  
  33.     PROTECTED BODY Screen IS
  34.  
  35.         PROCEDURE ClearScreen IS
  36.         BEGIN
  37.             VT100.ClearScreen;
  38.         END ClearScreen;
  39.  
  40.         PROCEDURE Display_At(Column, Row : Integer; C : Character) IS
  41.     
  42.         BEGIN
  43.             VT100.MoveCursor(Column,Row);
  44.             Put(C);
  45.         END Display_At;  
  46.     END Screen;
  47.  
  48.     SUBTYPE Interval IS INTEGER RANGE 1 .. 10;
  49.  
  50.     TASK Display_A; -- This is the specification part of Display_A
  51.     TASK Display_B;
  52.  
  53.     TASK BODY Display_A IS -- This is the body part of Display_A
  54.     BEGIN
  55.         FOR I IN Interval LOOP
  56.             Display_At(I,1,'A');
  57.             DELAY 0.01;
  58.         END LOOP;
  59.     END Display_A;
  60.  
  61.     TASK BODY Display_B IS
  62.     BEGIN
  63.         FOR I IN Interval LOOP
  64.             Display_At(I,2,'B');
  65.             DELAY 0.01;
  66.         END LOOP;
  67.     END Display_B;
  68.  
  69. BEGIN
  70.     ClearScreen;
  71.     New_Line;
  72. END Concurrent_Programming_2;